热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

蛙跳|汉密尔顿_theano学习指南混合蒙特卡洛采样(翻译)

篇首语:本文由编程笔记#小编为大家整理,主要介绍了theano学习指南--混合蒙特卡洛采样(翻译)相关的知识,希望对你有一定的参考价值。欢迎fork我的github&#x

篇首语:本文由编程笔记#小编为大家整理,主要介绍了theano学习指南--混合蒙特卡洛采样(翻译)相关的知识,希望对你有一定的参考价值。


欢迎fork我的github:https://github.com/zhaoyu611/DeepLearningTutorialForChinese

最近在学习Git,所以正好趁这个机会,把学习到的知识实践一下~ 看完DeepLearning的原理,有了大体的了解,但是对于theano的代码,还是自己撸一遍印象更深 所以照着deeplearning.net上的代码,重新写了一遍,注释部分是原文翻译和自己的理解。 感兴趣的小伙伴可以一起完成这个工作哦~ 有问题欢迎联系我 Email: zhaoyuafeu@gmail.com QQ: 3062984605




理论

能量模型的最大化似然函数需要一个鲁棒算法对负项进行采样。(见 Restricted Boltzmann Machines (RBM)的公式4)。当使用CD或PCD训练RBms时,通常使用块Gibbs采样,其中条件分布

p(h|v)


p(v|h)
是马尔科夫链的转换操作。
然而在某些情况下,这些条件分布难以采样(例如RBM的均方差,逆矩阵)。同样,即使能够有效的Gibbs采样,由于它采用随机采样,所以对某些分布效果可能不理想。本文中,当从连续变量中采样时,可以证明混合蒙特卡洛法(HMC)是一种有效的工具[Duane87]。它模仿物理系统中的密尔顿动力学,从而较好了解决了条件分布的采样过程。
在HMC,模拟物理系统进行采样。物理系统中粒子拥有势能和动能,从而在高维空间运动。根据 [Neal93]提出的概念,粒子可以通过位置矢量(或状态矢量

sRD
)和速度矢量

ϕRD
。粒子的组合态表示为

χ=(s,ϕ)
。汉密尔顿定义为势能

E(s)
(能量模型使用同样的能量函数)和动能的总和。定义如下:






相比直接采样



p(s)
,HMC从正则分布
采样。因为两个变量是相互独立的,边缘化的



ϕ
是原始分布无重要影响。

汉密尔顿动力学

在仿真环境中,即使状态量

ϕ
和速度量

ϕ
发生变化,

H(s,ϕ)
也会保持不变。微分方程如下:
(1)
[Neal93]指出,上述变换是可逆的。上述动力学方程可以看做是马尔科夫链的变形,但

p(s,ϕ)
是保持不变的。链本身不会变化,因为仿真动力学方程会保持固定的汉密尔顿函数

H(s,ϕ)
。HMC在汉密尔顿动力学函数和速度的Gibbs采样中交替进行。因为

p(s)


p(ϕ)
相互独立,所以无须进行

ϕnewp(ϕ|s)
,因为

p(ϕ|s)=p(ϕ)
,通常

p(ϕ)
是单变量高斯分布。


蛙跳算法

事实上,由于研究的问题是时间离散的,所以我们无法精确的计算汉密尔顿动力学方程。这里有若干解决途径。为了保持马尔科夫链的不变性,必须保持容积恒定和时间可逆的属性。蛙跳算法保持这些属性,并执行三步操作:
(2)
在时刻

t+ϵ/2
我们执行半步速度更新,来计算

s(t+ϵ)


ϕ(t+ϵ)


接受/拒绝

事实上,有限步长

ϵ
不能精确的保证

H(s,ϕ)
恒定,所以引入偏置的概念。另一方面,浮点数的舍入误差意味着变换过程并不是完全可逆的。
HMC在

n
步蛙跳后,引入了接受/拒绝阶段。新状态量χ=(s,ϕ)以概率

pacc(χ,χ)
接受。

pacc(χ,χ)
定义为:


HMC算法

本教程中,获得新的HMC样本方法如下:


  1. 根据单变量高斯分布采样新的速度
  2. 执行

    n
    步蛙跳获得新的状态量χ


  3. χ
    执行接受/拒绝

使用Theano运行HMC

在Theano中,更新字典和共享变量为执行采样算法提供了最自然的方法。样本当前状态量可以用Theano共享变量表示,而HMC的更新列表通过Theano的更新函数获得。
将HMC算法分解为以下子组件:


  • simulate_dynamics:Python符号函数,输入为初始位置和速度,执行

    n_step
    蛙跳更新,并返回符号变量:计算的状态量

    χ
  • hmc_move:Python符号函数,输入为起始位置,随机采样速度矢量,生成状态量

    χ
    。然后调用simulate_dynamics函数,决定是否接受从

    χχ
    的转换。
  • hmc_updates:Python函数,输入为hmc_move的符号输出量,输入为一次HMC过程的更新列表。
  • HMC_sampler:Python类,整合上述函数

simulate_dynamics

为了执行

n
步蛙跳采样,我们这里定义一个函数便于Scan函数的使用。不同于公式(2),我们可以对ϕ执行前半步更新,然后对

s
ϕ执行

n
步更新,对ϕ执行后半步更新,从而获得

s(t+nϵ)


ϕ(t+nϵ)
。对于循环形式,可以写做:
(3)
公式中内循环是通过执行leapfrog函数实现的,其中分别用

pos,ve var cpro_id = "u6885494";

推荐阅读
  • 掌握PHP编程必备知识与技巧——全面教程在当今的PHP开发中,了解并运用最新的技术和最佳实践至关重要。本教程将详细介绍PHP编程的核心知识与实用技巧。首先,确保你正在使用PHP 5.3或更高版本,最好是最新版本,以充分利用其性能优化和新特性。此外,我们还将探讨代码结构、安全性和性能优化等方面的内容,帮助你成为一名更高效的PHP开发者。 ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 如何使用Python去除字符串中的非中文字符[Python编程技巧]
    在 Python 中,可以通过正则表达式来实现去除字符串中的非中文字符。具体方法是使用 `re` 模块中的 `re.sub()` 函数,配合正则表达式 `[^u4e00-u9fa5]` 来匹配并替换掉所有非中文字符,从而保留字符串中的中文部分。这种方法简洁高效,适用于多种文本处理场景。 ... [详细]
  • 从2019年AI顶级会议最佳论文,探索深度学习的理论根基与前沿进展 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • 网络爬虫的规范与限制
    本文探讨了网络爬虫引发的问题及其解决方案,重点介绍了Robots协议的作用和使用方法,旨在为网络爬虫的合理使用提供指导。 ... [详细]
  • Spring 切面配置中的切点表达式详解
    本文介绍了如何在Spring框架中使用AspectJ风格的切面配置,详细解释了切点表达式的语法和常见示例,帮助开发者更好地理解和应用Spring AOP。 ... [详细]
  • 双指针法在链表问题中应用广泛,能够高效解决多种经典问题,如合并两个有序链表、合并多个有序链表、查找倒数第k个节点等。本文将详细介绍这些应用场景及其解决方案。 ... [详细]
  • 本文将详细介绍如何注册码云账号、配置SSH公钥、安装必要的开发工具,并逐步讲解如何下载、编译 HarmonyOS 2.0 源码。通过本文,您将能够顺利完成 HarmonyOS 2.0 的环境搭建和源码编译。 ... [详细]
  • 解决问题:1、批量读取点云las数据2、点云数据读与写出3、csf滤波分类参考:https:github.comsuyunzzzCSF论文题目ÿ ... [详细]
  • Java swing 连连看小游戏  开发小系统 项目源代码 实训实验毕设
    Javaswing连连看小游戏开发小系统项目源代码实训实验能满足学习和二次开发可以作为初学者熟悉Java的学习,作为老师阶段性学习的一个成功检验不再是单调的理解老师空泛的知识,导入 ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
author-avatar
家居生活我最大_386
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有